/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package model;

import java.util.ArrayList;
import java.util.List;
import servidorRMI.AddObservadorImp;
import servidorRMI.VerificaFalencia;
import state.implementacoes.Cadastrando;
import state.implementacoes.Falido;

/**
 *
 * @author Lucas
 *
 * UTILIZADO PADRAO SINGLETON.... Existe apenas umas lista de jogadores.....
 */
public abstract class ListaJogadores {

    /*
     * Variavel da lista dos jogadores e uma para padrao singleton...
     * o qual permite apenas uma estençao deste objeto.
     */
    private static ListaJogadores instancia;
    private List<Jogador> listaJogadores;
    private int jogadorDavez = 0;

    /*
     * Metodo construtor o qual instancia uma arraylista para os jogadores...
     */
    public ListaJogadores() {
        listaJogadores = new ArrayList<Jogador>();
    }

    /*
     * Realiza uma adicição de jogador a lista.....
     * Faz os testes nescessarios para que nao acarrete algum erro...
     */
    public String adicionar(Jogador jogador) {
        if (listaJogadores.size() < 6) { //Compara o tamanho da lista com 6 -- permite apenas 6 jogadores..
            if (!(buscarJogador(jogador.getName()) == null)) {   //Chama funçao para conferir o apelido (Nome)...
                return T.APELIDO_EXISTE;
            } else {
                if (buscarCor(jogador.getColor())) { //Chama função para conferir a cor...
                    return T.COR_USADA;
                } else {
                    listaJogadores.add(jogador);    //Cadastra o jogador....
                    return T.OK;
                }
            }
        } else {
            return T.LIMITE_JOGADORES;
        }
    }

    //Remove um jogador da lista....
    public void remover(String jogadorName) {
        for (Jogador j : listaJogadores) {
            if (j.getName().toLowerCase().equals(jogadorName)) {
                listaJogadores.remove(j);
            }
        }
    }

    /*
     * Altera o status do jogador... isso diz que o mesmo esta pronto para o jogo...
     */
    public boolean alterarStatus(String name) {
        for (Jogador jogador : listaJogadores) {
            if (jogador.getName().toLowerCase().equals(name.toLowerCase())) {
                jogador.confirmar();
                return true;
            }
        }
        return false;
    }

    //Busca o jogador pelo nome... caso exista retorna true
    public Jogador buscarJogador(String nome) {
        for (Jogador jogador : listaJogadores) {
            if (jogador.getName().toLowerCase().equals(nome.toLowerCase())) {
                return jogador; //Caso jogador exista retorna true....
            }
        }
        return null;
    }

    //Busca dentro da lista se a cor informada ja esta sendo utilizada... retorna
    //true caso esteja sendo utilzada....
    public boolean buscarCor(String cor) {
        for (Jogador jogador : listaJogadores) {
            if (jogador.getColor().equals(cor)) {
                return true; //Caso a cor ja esteja sendo utilizada...
            }
        }
        return false;
    }

    /*
     * get para retornar a lista de jogadores populada...
     */
    public List<Jogador> getListaJogadores() {
        return listaJogadores;
    }

    public boolean todosTrue() {
        if (listaJogadores.size() < 2) {
            return false;
        } else {
            for (Jogador jogador : listaJogadores) {
                if (jogador.getState() instanceof Cadastrando) {
                    return false;
                }
            }
            return true;
        }
    }


    /*
     * instancia nescessaria para o padrao Singleton
     */
    public static ListaJogadores getInstancia() {
        if (instancia == null) {
            synchronized (ListaJogadores.class) {
                if (instancia == null) {
                    instancia = new ListaJogadores() {
                    };
                }
            }
        }
        return instancia;
    }

    public void nextJogador() {
        if(!(listaJogadores.size() == jogadorDavez + 1)){
            jogadorDavez++;
        }else{
            jogadorDavez = 0;
        }  
        
        //Verifica se o jogador esta falido... caso esteja passa para o proximo jogador...
        Jogador jog = listaJogadores.get(jogadorDavez);
        if(jog.getState() instanceof Falido){
            AddObservadorImp.getInstancia().notificarMensagem(jog.getName(), 
                    "Você esta falido!!!");
            nextJogador();
        }
        
        //Procura ganhador
        VerificaFalencia vf = new VerificaFalencia();
        vf.campeao();
    }
    
    public Jogador jogadorVez(){
        return listaJogadores.get(jogadorDavez);
    }
}
